package com.sacfa.proveedores.bo;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import org.apache.log4j.Logger;

import com.sacfa.commons.beans.Banco;
import com.sacfa.commons.beans.Direccion;
import com.sacfa.commons.connection.PoolConexion;
import com.sacfa.proveedores.beans.Proveedor;
import com.sacfa.proveedores.sql.ProveedorSQL;

public class ProveedorBo {
	private static Logger log = Logger.getLogger(ProveedorBo.class);
	
	public void registrar(Proveedor proveedor){
		PreparedStatement stm = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			PoolConexion.getInstance().beginTransaction(conex);
			
			stm = conex.prepareStatement(ProveedorSQL.INSERT);
			if(!proveedor.getRazonSocial().equals("")){
				stm.setString(1, proveedor.getRazonSocial());
				stm.setString(2, null);
				stm.setString(3, null);
				stm.setString(4, null);
			} else {
				stm.setString(1, null);
				stm.setString(2, proveedor.getNombre());
				stm.setString(3, proveedor.getApellidoPaterno());
				stm.setString(4, proveedor.getApellidoMaterno());
			}
			stm.setInt(5,proveedor.getDireccion().getId());
			stm.setBigDecimal(6,proveedor.getCredito());
			stm.setInt(7,proveedor.getBanco().getId());
			stm.setString(8,proveedor.getNumerocuenta());
			stm.setString(9,proveedor.getRFC());
			stm.executeUpdate();
			
			PoolConexion.getInstance().commit(conex);
			PoolConexion.getInstance().endTransaction(conex);
		} catch(SQLException ex) {
			log.info("Error SQL: " + ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
	}
	
	public void modificar(Proveedor proveedor){
		PreparedStatement stm = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			PoolConexion.getInstance().beginTransaction(conex);
			
			stm = conex.prepareStatement(ProveedorSQL.UPDATE);
			stm.setInt(1, proveedor.getId());
			if(!proveedor.getRazonSocial().equals("")){
				stm.setString(1, proveedor.getRazonSocial());
				stm.setString(2, null);
				stm.setString(3, null);
				stm.setString(4, null);
			} else {
				stm.setString(1, null);
				stm.setString(2, proveedor.getNombre());
				stm.setString(3, proveedor.getApellidoPaterno());
				stm.setString(4, proveedor.getApellidoMaterno());
			}
			stm.setInt(5,proveedor.getDireccion().getId());
			stm.setBigDecimal(6,proveedor.getCredito());
			stm.setInt(7,proveedor.getBanco().getId());
			stm.setString(8,proveedor.getNumerocuenta());
			stm.setString(9,proveedor.getRFC());
			stm.executeUpdate();
			
			PoolConexion.getInstance().commit(conex);
			PoolConexion.getInstance().endTransaction(conex);
		} catch(SQLException ex) {
			log.info("Error SQL: " + ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
	}
	
	public Proveedor consultar(Proveedor proveedor){
		Direccion direccion = new Direccion();
		Banco banco = new Banco();
		PreparedStatement stm = null;
		ResultSet rs = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			stm = conex.prepareStatement(ProveedorSQL.SELECT_ONE);
			stm.setInt(1, proveedor.getId());
			rs = stm.executeQuery();
			
			rs.next();
			proveedor.setId(rs.getInt(1));
			proveedor.setRazonSocial(rs.getString(2));
			proveedor.setNombre(rs.getString(3));
			proveedor.setApellidoPaterno(rs.getString(4));
			proveedor.setApellidoMaterno(rs.getString(5));
			direccion.setId(rs.getInt(6));
			proveedor.setDireccion(direccion);
			proveedor.setCredito(rs.getBigDecimal(7));
			banco.setId(rs.getInt(8));
			proveedor.setBanco(banco);
			proveedor.setNumerocuenta(rs.getString(9));
			proveedor.setRFC(rs.getString(10));
		} catch(SQLException ex) {
			log.info("Error SQL: " + ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
		return proveedor;
	
	}
	public Collection<Proveedor> consultaGeneral(){
		Collection<Proveedor> proveedores = new ArrayList<Proveedor>();
		Proveedor proveedor = new Proveedor();
		Direccion direccion = new Direccion();
		Banco banco = new Banco();
		PreparedStatement stm = null;
		ResultSet rs = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			stm = conex.prepareStatement(ProveedorSQL.SELECT_ALL);
			rs = stm.executeQuery();
			
			while(rs.next()){
				proveedor.setId(rs.getInt(1));
				proveedor.setRazonSocial(rs.getString(2));
				proveedor.setNombre(rs.getString(3));
				proveedor.setApellidoPaterno(rs.getString(4));
				proveedor.setApellidoMaterno(rs.getString(5));
				direccion.setId(rs.getInt(6));
				proveedor.setDireccion(direccion);
				proveedor.setCredito(rs.getBigDecimal(7));
				banco.setId(rs.getInt(8));
				proveedor.setBanco(banco);
				proveedor.setNumerocuenta(rs.getString(9));
				proveedor.setRFC(rs.getString(10));
				proveedores.add(proveedor);
			}
		} catch(SQLException ex) {
			log.info("Error SQL: " + ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
		return proveedores;
	}
	
	public void eliminar(Proveedor proveedor){
		PreparedStatement stm = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			PoolConexion.getInstance().beginTransaction(conex);
			
			stm = conex.prepareStatement(ProveedorSQL.DELETE);
			stm.setInt(1,proveedor.getId());
			stm.executeUpdate();
			
			PoolConexion.getInstance().commit(conex);
			PoolConexion.getInstance().endTransaction(conex);
		} catch(SQLException ex) {
			log.info("Error SQL: " + ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
	}
}
